package net.opentsdb.plugin.impl;

import com.stumbleupon.async.Deferred;
import net.opentsdb.core.TSDB;
import net.opentsdb.meta.TsuidDelete;
import net.opentsdb.stats.StatsCollector;
import net.opentsdb.uid.UniqueId;
import net.opentsdb.utils.hbase.HbaseMetaUtils;
import net.opentsdb.utils.hbase.HbaseTagUtils;
import net.opentsdb.utils.hbase.HbaseTsdbUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TsuidDeleteImpl extends TsuidDelete {

    private static final Logger LOG = LoggerFactory.getLogger(TsuidDeleteImpl.class);

    private TSDB tsdb;
    private HbaseMetaUtils utils;
    private HbaseTagUtils tagUtils;
    private HbaseTsdbUtils tsdbUtils;

    @Override
    public void initialize(TSDB tsdb) {
        this.tsdb = tsdb;
        utils = tsdb.getHbaseWrapper().metaUtils;
        tagUtils = tsdb.getHbaseWrapper().tagUtils;
        tsdbUtils = tsdb.getHbaseWrapper().tsdbUtils;
    }

    @Override
    public Deferred<Object> shutdown() {
        return Deferred.fromResult(null);
    }

    @Override
    public String version() {
        return "0.0.1";
    }

    @Override
    public void collectStats(StatsCollector collector) {

    }

    @Override
    public void deleteTsuid(String tsuid) {
        byte[] byteUid = UniqueId.stringToUid(tsuid);

        // 判断时间线是否存在数据，存在数据则不删除
        // 待删除，有直接清理时间线需求，因此不能在此判断时间线是否存在
        /*if(tsdbUtils.existsDataByTsuid(tsuid)){
            LOG.debug("tsuid {} exists data, so don't delete it",tsuid);
            return;
        }*/

        if(!utils.existsDelTsuid(byteUid)
                && utils.existsTsuid(byteUid)){

            LOG.debug("delete tsuid {} and the reference tag tree ",tsuid);

            //成功删除meta对应tsuid，加入tsuid删除区，总计数减1
            //无论删除成功与否，删除之后返回的object都为null
            try{
                utils.deleteCountMeta(byteUid).joinUninterruptibly();
            }catch (Exception e){
                LOG.error("delete data error:",e);
            }
//            utils.storeDelTSMeta(byteUid);
            // 判断是否已经插入
            if(utils.storeCasDelTSMeta(byteUid))
                utils.decrementDefaultAndGetCounter();

            // 删除树形结构
            // TODO 删除时间线无法确定tagk、tagv能否删除，存在问题
//            tagUtils.deleteTagTree(byteUid);
            return;
        }

        LOG.debug("tsuid {} in delete queue",tsuid);
    }

    @Override
    public void deleteMapTsuid(String tsuid){
        byte[] byteUid = UniqueId.stringToUid(tsuid);

        tsdb.getMetaCache().removeIncrementTsuid(byteUid);
    }
}
